7093
11182
Jaká je nejrychlejší metoda pro převod java.nio.ByteBuffer a na (nově vytvořený) CharBuffer b nebo char [] b.
Přitom je důležité, aby a [i] == b [i]. To znamená, že ne a [i] a [i + 1] společně tvoří hodnotu b [j], co by udělalo getChar (i), ale hodnoty by měly být „spread“.
byte a [] = {1,2,3, 125,126,127, -128, -127, -126} // každý bajt (které jsou podepsané)
char b [] = {1,2,3, 125,126,127, 128, 129, 130} // každý znak (které jsou nepodepsané)
Všimněte si, že byte: -128 má stejné (nižší 8) bity jako char: 128. Proto předpokládám, že „nejlepší“ interpretace bude taková, jak jsem ji poznamenal výše, protože bity jsou stejné.
Poté potřebuji také překlad naopak: Nejúčinnější způsob, jak získat char [] nebo java.nio.CharBuffer zpět do java.nio.ByteBuffer. 
To, co chcete, je převést pomocí kódování ISO-8859-1.
Netvrdím nic o efektivitě, ale alespoň je celkem krátké napsat:
Výsledek CharBuffer = Charset.forName ("ISO-8859-1"). Dekódovat (byteBuffer);
Druhý směr by byl:
Výsledek ByteBuffer = Charset.forName ("ISO-8859-1"). Encode (charBuffer);
Změřte to prosím oproti jiným řešením. (Abychom byli spravedliví, část Charset.forName by neměla být zahrnuta a měla by být také provedena pouze jednou, nikoli znovu pro každou vyrovnávací paměť.)
Od Javy 7 existuje také třída StandardCharsets s předem vytvořenými instancemi Charset, takže můžete použít
Výsledek CharBuffer = StandardCharsets.ISO_8859_1.decode (byteBuffer);
a
Výsledek ByteBuffer = StandardCharsets.ISO_8859_1.encode (charBuffer);
namísto. (Tyto řádky fungují stejně jako ty předchozí, pouze vyhledávání je snazší a nehrozí chybné zadání jmen a není třeba chytat nemožné výjimky.)
|
Souhlasil bych s @ Ishtar, navrhnout, aby se vůbec vyhnul převodu na novou strukturu a převádět pouze tak, jak potřebujete.
Pokud však máte hromadu ByteBuffer, můžete to udělat.
ByteBuffer bb = ...
byte [] pole = bb.array ();
char [] chars = nový char [bb.remaining ()];
for (int i = 0; i